#!/bin/bash

# 数据网关构建脚本
# 作者: Data Gateway Team
# 版本: 1.0.0

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}

log_debug() {
    echo -e "${BLUE}[DEBUG]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}

# 显示帮助信息
show_help() {
    echo "数据网关构建脚本"
    echo ""
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -h, --help              显示帮助信息"
    echo "  -c, --clean             清理构建目录"
    echo "  -t, --test              运行测试"
    echo "  -p, --package           打包应用"
    echo "  -d, --docker            构建Docker镜像"
    echo "  -a, --all               执行所有步骤"
    echo "  --skip-tests            跳过测试"
    echo "  --skip-docker           跳过Docker构建"
    echo "  --profile PROFILE       指定Maven Profile"
    echo "  --version VERSION       指定版本号"
    echo ""
    echo "示例:"
    echo "  $0 --all                # 执行完整构建"
    echo "  $0 --package --skip-tests  # 跳过测试打包"
    echo "  $0 --docker --version 1.0.1  # 构建指定版本Docker镜像"
}

# 检查依赖
check_dependencies() {
    log_info "检查构建依赖..."
    
    # 检查Java
    if ! command -v java &> /dev/null; then
        log_error "Java未安装或不在PATH中"
        exit 1
    fi
    
    java_version=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2 | cut -d'.' -f1)
    if [ "$java_version" -lt 11 ]; then
        log_error "需要Java 11或更高版本，当前版本: $java_version"
        exit 1
    fi
    log_info "Java版本检查通过: $(java -version 2>&1 | head -n 1)"
    
    # 检查Maven
    if ! command -v mvn &> /dev/null; then
        log_error "Maven未安装或不在PATH中"
        exit 1
    fi
    log_info "Maven版本: $(mvn -version | head -n 1)"
    
    # 检查Docker（如果需要）
    if [ "$BUILD_DOCKER" = true ]; then
        if ! command -v docker &> /dev/null; then
            log_error "Docker未安装或不在PATH中"
            exit 1
        fi
        log_info "Docker版本: $(docker --version)"
    fi
    
    log_info "依赖检查完成"
}

# 清理构建目录
clean_build() {
    log_info "清理构建目录..."
    
    if [ -d "target" ]; then
        rm -rf target
        log_info "已清理target目录"
    fi
    
    if [ -d "logs" ]; then
        rm -rf logs
        log_info "已清理logs目录"
    fi
    
    log_info "清理完成"
}

# 运行测试
run_tests() {
    if [ "$SKIP_TESTS" = true ]; then
        log_warn "跳过测试"
        return 0
    fi
    
    log_info "运行测试..."
    
    # 运行单元测试
    log_info "运行单元测试..."
    mvn test -Dspring.profiles.active=test
    
    # 运行集成测试
    log_info "运行集成测试..."
    mvn verify -Dspring.profiles.active=test
    
    # 生成测试报告
    log_info "生成测试报告..."
    mvn jacoco:report
    
    log_info "测试完成"
}

# 打包应用
package_app() {
    log_info "打包应用..."
    
    # 设置Maven参数
    mvn_args="package"
    
    if [ "$SKIP_TESTS" = true ]; then
        mvn_args="$mvn_args -DskipTests"
    fi
    
    if [ -n "$MAVEN_PROFILE" ]; then
        mvn_args="$mvn_args -P$MAVEN_PROFILE"
    fi
    
    if [ -n "$VERSION" ]; then
        mvn_args="$mvn_args -Drevision=$VERSION"
    fi
    
    # 执行打包
    log_info "执行Maven打包: $mvn_args"
    mvn $mvn_args
    
    # 检查JAR文件
    jar_file="target/data-gateway-${VERSION:-1.0.0}.jar"
    if [ -f "$jar_file" ]; then
        log_info "应用打包成功: $jar_file"
        log_info "文件大小: $(du -h "$jar_file" | cut -f1)"
    else
        log_error "应用打包失败: $jar_file 不存在"
        exit 1
    fi
}

# 构建Docker镜像
build_docker() {
    if [ "$SKIP_DOCKER" = true ]; then
        log_warn "跳过Docker构建"
        return 0
    fi
    
    log_info "构建Docker镜像..."
    
    # 检查Dockerfile
    if [ ! -f "Dockerfile" ]; then
        log_error "Dockerfile不存在"
        exit 1
    fi
    
    # 设置镜像标签
    image_tag="data-gateway:${VERSION:-1.0.0}"
    if [ -n "$VERSION" ]; then
        image_tag="data-gateway:$VERSION"
    fi
    
    # 构建镜像
    log_info "构建Docker镜像: $image_tag"
    docker build -t "$image_tag" .
    
    # 检查镜像
    if docker images | grep -q "data-gateway"; then
        log_info "Docker镜像构建成功: $image_tag"
        log_info "镜像大小: $(docker images --format 'table {{.Size}}' data-gateway | tail -n 1)"
    else
        log_error "Docker镜像构建失败"
        exit 1
    fi
}

# 显示构建信息
show_build_info() {
    log_info "构建信息:"
    log_info "  项目名称: Data Gateway"
    log_info "  版本: ${VERSION:-1.0.0}"
    log_info "  Java版本: $(java -version 2>&1 | head -n 1)"
    log_info "  Maven版本: $(mvn -version | head -n 1)"
    
    if [ "$BUILD_DOCKER" = true ]; then
        log_info "  Docker版本: $(docker --version)"
    fi
    
    log_info "  构建时间: $(date '+%Y-%m-%d %H:%M:%S')"
    log_info "  构建用户: $(whoami)"
    log_info "  构建目录: $(pwd)"
}

# 主函数
main() {
    # 默认参数
    CLEAN_BUILD=false
    RUN_TESTS=false
    PACKAGE_APP=false
    BUILD_DOCKER=false
    BUILD_ALL=false
    SKIP_TESTS=false
    SKIP_DOCKER=false
    MAVEN_PROFILE=""
    VERSION=""
    
    # 解析命令行参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -c|--clean)
                CLEAN_BUILD=true
                shift
                ;;
            -t|--test)
                RUN_TESTS=true
                shift
                ;;
            -p|--package)
                PACKAGE_APP=true
                shift
                ;;
            -d|--docker)
                BUILD_DOCKER=true
                shift
                ;;
            -a|--all)
                BUILD_ALL=true
                shift
                ;;
            --skip-tests)
                SKIP_TESTS=true
                shift
                ;;
            --skip-docker)
                SKIP_DOCKER=true
                shift
                ;;
            --profile)
                MAVEN_PROFILE="$2"
                shift 2
                ;;
            --version)
                VERSION="$2"
                shift 2
                ;;
            *)
                log_error "未知参数: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    # 如果指定了--all，设置所有标志
    if [ "$BUILD_ALL" = true ]; then
        CLEAN_BUILD=true
        RUN_TESTS=true
        PACKAGE_APP=true
        BUILD_DOCKER=true
    fi
    
    # 如果没有指定任何操作，默认打包
    if [ "$CLEAN_BUILD" = false ] && [ "$RUN_TESTS" = false ] && [ "$PACKAGE_APP" = false ] && [ "$BUILD_DOCKER" = false ]; then
        PACKAGE_APP=true
    fi
    
    # 显示构建信息
    show_build_info
    
    # 检查依赖
    check_dependencies
    
    # 执行构建步骤
    if [ "$CLEAN_BUILD" = true ]; then
        clean_build
    fi
    
    if [ "$RUN_TESTS" = true ]; then
        run_tests
    fi
    
    if [ "$PACKAGE_APP" = true ]; then
        package_app
    fi
    
    if [ "$BUILD_DOCKER" = true ]; then
        build_docker
    fi
    
    log_info "构建完成！"
    
    # 显示结果
    if [ "$PACKAGE_APP" = true ]; then
        jar_file="target/data-gateway-${VERSION:-1.0.0}.jar"
        if [ -f "$jar_file" ]; then
            log_info "JAR文件: $jar_file"
        fi
    fi
    
    if [ "$BUILD_DOCKER" = true ]; then
        image_tag="data-gateway:${VERSION:-1.0.0}"
        log_info "Docker镜像: $image_tag"
    fi
}

# 执行主函数
main "$@"
